接着上一篇来分析一个典型streaming应用背后的启动过程。
源码跟踪
StreamingContext中声明了一个JobScheduler对象:
由此追踪JobScheduler中的start方法
listenerBus
是一个StreamingListenerBus对象,用来异步向StreamingListener传递StreamingListenerEvents
下面看一下ReceiverTracker中的start方法
receiverExecutor是一个receiverLauncher对象,receiverLauncher线程类执行集群上所有的receiver。重点关注一下其中一个startReceiver方法:
分发receiver的时候runJob带了一个方法参数,startReceiver,这个方法是一个内部定义的(上面代码中有注释说明),这个方法实例化了一个ReceiverSupervisorImpl对象,也就是将会执行的executor,并调用了start方法启动,很明显,这个start方法定义在了ReceiverSupervisorImpl中
继续看最终可以追溯到一个onStart方法,和一个startReceiver方法,onStart方法在ReceiverSupervisorImpl中有实现:
startReceiver方法在ReceiverSupervisor中实现:
这里的receiver.onStart()是启动一个SocketReveiver对象receiver,在SocketInputDStream类中真正其实现如下:
启动一个receive线程,receive()的实现紧接着在onStart()下实现:
可以看出在这里是真正创建一个socket并实现连接,接收数据。
小结
以上是wordCount启动流程,并没有涉及到本质的细节,接下来将会详细探讨一下
- receiver如何接收和保存流数据
- sparkContext中runJob执行调度细节